<?php
/**
 * Created by PhpStorm.
 * User: hgs
 * Date: 16/4/15
 * Time: 上午10:31
 */

namespace C\lib {

	class Sms {

		static $base = 'http://570.pro-group.cn:28080/chif10';
		static $user = 'a00780';
		static $pwd = 'thfbju';

		public static function send($phone, $data) {

			$url = self::$base . '/mtsms/' . self::$user . '/' . md5 ( self::$user . date ('YmdHis') . self::$pwd);
			$data = json_encode ( array (
				'Cli_Msg_Id' => uniqid (), // 客户流水号，可在响应中携带返回，最长24位，数 字、字母
				'Pk_total' => 1, // 相同信息总条数，从1开始 默认为1
				'Pk_number' => 1, // 相同信息序号，从1开始 默认为1
				'Registered_Delivery' => 1, // 是否要求返回状态确认报告： 0：不需要 1：需要 默认为0-不要状态报告
				'Msg_level' => 0, // 信息级别 （0-9）数字越大，级别越高 默认为0
				'Service_Id' => '', // 业务类型，是数字、字母和符号的组合 默认为空
				'TP_pId' => 0, // GSM 协议类型。详细是解释请参考 GSM03.40 中 的9.2.3.9 默认0
				'TP_udhi' => 0, // GSM 协议类型。详细是解释请参考 GSM03.40 中 的9.2.3.23,仅使用1位 默认0
				'Msg_Fmt' => 15, // 短信内容编码： 0：ASCII串 3：短信写卡操作 4：二进制信息 8：UCS2编码 15：含GB汉字 默认为15
				'Msg_src' => '', // 信息内容来源(数字、英文) 默认为空
				'Src_Id' => '', // 源号码，子扩展号，如可扩展，则扩展在短信平台 分配的扩展号后，但总号码不超过21位 默认为空-不扩展、使用短信平台分配的父扩展号
				'Dest_terminal_Id' => array (
					$phone
				), // 手机号码（最大21位），集合表示。 单次提交最多不能超过客户带宽。 手机号建议不重复，不强制限制。
				'Msg_Content' => self::getBytes(iconv('UTF-8', 'gbk', $data))
			)); // 短信内容，使用Msg_Fmt编码编码为Byte[]

			//$return_content = '';
			$return_content = self::httpPostData($url, $data);
            if($json = json_decode($return_content, true)) {
                if($json['Rets'][0]['Rspcode'] == 6)
                    return true;
                else
                    return false;
            } else
			    return false;
			
		}

        private static function httpPostData($url, $data_string) {
            
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                'Accept: application/json',
                'Content-Type: application/json; charset=utf-8',
                'Authorization:' . base64_encode ( self::$user . ':' . date('YmdHis'))
            ]);
            $return_content = curl_exec($ch);
            curl_close($ch);
            return $return_content;
            
        }

        private static function getBytes($string) {
            $bytes = array ();
            for($i = 0; $i < strlen ( $string ); $i ++) {
                if (ord ( $string [$i] ) < 128) {
                    $bytes [] = ord ( $string [$i] );
                } else {
                    $bytes [] = self::phpbin2javabin ( ord ( $string [$i] ) );
                }
            }
            return $bytes;
        }

        // byte的取值范围
        // http://bbs.itheima.com/thread-19018-1-1.html
        // ord转java
        private static function phpbin2javabin($ord) {
            $bin = decbin($ord); // 转成二进制
            $fan = self::bin2fan($bin); // 按位取反
            $plus = self::binplus($fan, 1); // 二进制加1
            $dec = bindec ($plus); // 转成ASCII值
            return - 1 * $dec;
        }

        // 二进制加法
        // binplus(101111,1)等于101111+1
        private static function binplus($arg1, $arg2) {
            if ($arg1 == '' || $arg2 == '')
                return false;
            $tmpsum = bindec($arg1) + bindec($arg2);
            return decbin($tmpsum);
        }

        // 按位取反
        private static function bin2fan($arg) {
            $arr = str_split ($arg);
            $bin_arr = [];
            foreach ($arr as $val)
                $bin_arr[] = !empty ($val) ? 0 : 1;
            return intval (implode ('', $bin_arr));
        }

	}
    
}

